/*
 * linux/arch/m68knommu/platform/68328/pilot/crt0_rom.S
 * - A startup file for the MC68332 
 *
 * Copyright (C) 1998  D. Jeff Dionne <jeff@ryeham.ee.ryerson.ca>,
 *                     Kenneth Albanowski <kjahds@kjahds.com>,
 *                     The Silver Hammer Group, Ltd.
 *
 * (c) 1995, Dionne & Associates
 * (c) 1995, DKG Display Tech.
 */

#define ASSEMBLY

#define IMMED #
#define	DBG_PUTC(x)	moveb IMMED x, 0xfffff907

#include <linux/config.h>

.global _stext
.global _start

.global _rambase
.global __ramvec
.global _ramvec
.global _ramstart
.global _ramend

.global penguin_bits

#ifdef CONFIG_PILOT

#define IMR 0xFFFFF304

	.data
	.align 16

penguin_bits:	
#include "bootlogo.rh"

#endif

/*****************************************************************************/

.data

/*
 *      Set up the usable of RAM stuff. Size of RAM is determined then
 *      an initial stack set up at the end.
 */
.align 4
_ramvec:
.long   0
_rambase:
.long   0
_ramstart:
.long   0
_ramend:
.long   0

.text
	
_start:
_stext:


#ifdef CONFIG_M68328

#ifdef CONFIG_PILOT
	.byte 0x4e, 0xfa, 0x00, 0x0a /* Jmp +X bytes */
	.byte 'b', 'o', 'o', 't'
	.word 10000

	nop
#endif

	moveq	#0, %d0
	movew   %d0, 0xfffff618 /* Watchdog off */
	movel	#0x00011f07, 0xfffff114 /* CS A1 Mask */

	movew	#0x0800, 0xfffff906 /* Ignore CTS */
	movew	#0x010b, 0xfffff902 /* BAUD to 9600 */

	movew	#0x2410, 0xfffff200 /* PLLCR */
	movew	#0x123, 0xfffff202 /* PLLFSR */

#ifdef CONFIG_PILOT
	moveb	#0, 0xfffffA27 /* LCKCON */
	movel   #_start, 0xfffffA00 /* LSSA */
	moveb   #0xa, 0xfffffA05 /* LVPW */
	movew	#0x9f, 0xFFFFFa08 /* LXMAX */
	movew	#0x9f, 0xFFFFFa0a /* LYMAX */
	moveb   #9, 0xfffffa29 /* LBAR */
	moveb   #0, 0xfffffa25 /* LPXCD */
	moveb	#0x04, 0xFFFFFa20 /* LPICF */
	moveb	#0x58, 0xfffffA27 /* LCKCON */
	moveb	#0x85, 0xfffff429 /* PFDATA */
	moveb	#0xd8, 0xfffffA27 /* LCKCON */
	moveb	#0xc5, 0xfffff429 /* PFDATA */
	moveb	#0xd5, 0xfffff429 /* PFDATA */

	moveal	#0x00100000, %a3
	moveal	#0x100ffc00, %a4
#endif /* CONFIG_PILOT */

#endif /* CONFIG_M68328 */

	movew   #0x2700, %sr
	lea	%a4@(-4), %sp

	DBG_PUTC('\r')
	DBG_PUTC('\n')
	DBG_PUTC('A')

   	moveq   #0,%d0
	movew	#16384, %d0  /* PLL settle wait loop */
L0:
	subw	#1, %d0
	bne	L0

	DBG_PUTC('B')

	/* Copy command line from beginning of RAM (+16) to end of bss */
	movel	#__ramvec, %d7
	addl	#16, %d7
	moveal	%d7, %a0
	moveal	#_ebss, %a1
	lea	%a1@(512), %a2

	DBG_PUTC('C')

	/* Copy %a0 to %a1 until %a1 == %a2 */
L2:
	movel	%a0@+, %d0
	movel	%d0, %a1@+
	cmpal	%a1, %a2
	bhi	L2

	/* Copy data+init segment from ROM to RAM */
	moveal	#_etext, %a0
	moveal	#_sdata, %a1
	moveal	#__init_end, %a2

	DBG_PUTC('D')

	/* Copy %a0 to %a1 until %a1 == %a2 */
LD1:
	movel	%a0@+, %d0
	movel	%d0, %a1@+
	cmpal	%a1, %a2
	bhi	LD1

	DBG_PUTC('E')

	moveal	#_sbss, %a0
	moveal	#_ebss, %a1

	/* Copy 0 to %a0 until %a0 == %a1 */
L1:
	movel	#0, %a0@+
	cmpal	%a0, %a1
	bhi	L1

	DBG_PUTC('F')

	/* Copy command line from end of bss to command line */
	moveal	#_ebss, %a0
	moveal	#command_line, %a1
	lea	%a1@(512), %a2

	DBG_PUTC('G')

	/* Copy %a0 to %a1 until %a1 == %a2 */
L3:
	movel	%a0@+, %d0
	movel	%d0, %a1@+
	cmpal	%a1, %a2
	bhi	L3

	movel	#_sdata, %d0	
	movel	%d0, _rambase	
	movel	#_ebss,	%d0
	movel	%d0, _ramstart

	movel	%a4, %d0
	subl	#4096, %d0	/* Reserve 4K of stack */
	moveq	#79, %d7
	movel	%d0, _ramend

	movel	%a3, %d0
	movel	%d0, rom_length

	pea	0
	pea	env
	pea	%sp@(4)
	pea	0

	DBG_PUTC('H')

#ifdef CONFIG_PILOT
	movel	#penguin_bits, 0xFFFFFA00
	moveb	#10, 0xFFFFFA05
	movew	#160, 0xFFFFFA08
	movew	#160, 0xFFFFFA0A
#endif /* CONFIG_PILOT */

	DBG_PUTC('I')

	lea	init_thread_union, %a0
	lea	0x2000(%a0), %sp

	DBG_PUTC('J')
	DBG_PUTC('\r')
	DBG_PUTC('\n')

	jsr	start_kernel
_exit:

	jmp	_exit


	.data
env:
	.long	0
